﻿//Auktionshus projekt, DM10X2, Anders Østergaard, Jesper Larsen og Mads Jakobsen, 19.9.2011

using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Collections.Generic;

namespace Auktion
{
    public class KlientTråd
    {
        private Socket clientSocket;
		private	NetworkStream netStream;
		private	StreamWriter writer;
		private	StreamReader reader;
        private ServerMonitor ServMon;
        private AuktionsMonitor AukMon;

        private IPAddress KlientIP; //byders IPADRESSE

        
        public KlientTråd(Socket clientSocket, ServerMonitor ServerMon, AuktionsMonitor aukm)
		{
			this.clientSocket = clientSocket;
            this.ServMon = ServerMon;
            this.AukMon = aukm;

		}

		public void LavKlient ()
		{
		    netStream = new NetworkStream(clientSocket); //opretter socket stream forbindelse
		    writer = new StreamWriter (netStream); //opretter skriv
		    reader = new StreamReader (netStream); //opretter læs

            IPEndPoint remoteEP = (IPEndPoint)clientSocket.RemoteEndPoint; //oplysninger om klienten i den anden ende
            KlientIP = remoteEP.Address; //klientens ip

            StartAuktionTilKlient();	//starter "samtale" med klienten			
		}

        public void sendTilKlient(string text) //sender besked til klienten
        {
            writer.WriteLine(text);
            writer.Flush(); //BLIR sendt
        }
        public string modtagFraKlient() //modtager fra klienten
        {
            try
            {
                return reader.ReadLine();
            }
            catch
            {
                return null;
            }
        }

        public void StartAuktionTilKlient()
        {

            while(KørOrdre());    // looper til der afmeldes
        }
        public bool KørOrdre()  //returner false hvis null eller bye
        {
            string command;
            command = modtagFraKlient(); //modtager første hvilken ordre fra klienten 1, 2 eller 3
            if (command == null)
                return false;       // ikke mere input
            switch (command.Trim().ToLower())
            {
                case "1": // 1 = tilmeld Klienten er nu tilmeldt auktionen
                    {   
                        ServMon.Tilmeld(this);   // her tilmelder man sig listen af bydere
                       
                        //her gives info om auktionen - der sendes både ip og besked i det tilfælde, at beskeden KUN skal ud til en enkel klient
                        // så kan der på klienten, lyttes om beskeden skal vises hvis ip = klients ip
                        sendTilKlient(KlientIP.ToString()); //sender ip
                        sendTilKlient("Velkommen til auktionen"); //sender besked
                        sendTilKlient(KlientIP.ToString());
                        sendTilKlient(ServMon.AuktionsNavn);
                        sendTilKlient(KlientIP.ToString());
                        sendTilKlient(AukMon.AccepteretBud.ToString());
                    }
                    break;
                case "3": // 3 = bud
                    {
                        string inputMsg = modtagFraKlient();  // bud
                        int pris = Convert.ToInt32(inputMsg); // budet laves om til en int
                        AukMon.ModtagBud(pris, KlientIP); //validere buddet
                    }
                    break;
                case "2": // 2 = afmeld
                    {   
                        ServMon.Afmeld(this);
                        sendTilKlient(KlientIP.ToString());
                        sendTilKlient("Du er nu afmeldt");
                        return false;
                    }
            }
            return true;
        }

        //Properties

        public IPAddress KlientIP1
        {
            get { return KlientIP; }
            set { KlientIP = value; }
        }

    }
}
